package com.cy.store.service.impl;

import com.cy.store.entity.Cart;
import com.cy.store.entity.Product;
import com.cy.store.mapper.CartMapper;
import com.cy.store.mapper.ProductMapper;
import com.cy.store.service.ICartService;
import com.cy.store.service.ex.AccessDeniedException;
import com.cy.store.service.ex.CartNotFoundException;
import com.cy.store.service.ex.InsertEception;
import com.cy.store.service.ex.UpdateException;
import com.cy.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class CartServiceImpl implements ICartService {
    /**
     * 购物车的业务层依赖于购物车的持久层以及商品的持久层
     */
    @Autowired(required = false)
    private CartMapper cartMapper;
    @Autowired(required = false)
    private ProductMapper productMapper;

    /**
     * 将商品添加到购物车中
     *
     * @param uid      用户id
     * @param pid      商品id
     * @param amount   新增数量
     * @param username 用户名（修改人）
     */
    @Override
    public void addToCart(Integer uid, Integer pid, Integer amount, String username) {
        // 查询当前要添加的这个购物是否在表中已存在
        Cart result = cartMapper.findByUidAndPid(uid, pid);

        Date date = new Date();

        if (result == null) { //表示 这个商品从来没有被添加到数据表中
            //创建一个cart对象
            Cart cart = new Cart();
            //补全数据：参数传递的数据
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);

            cartMapper.insert(cart);
            //价格：来自于商品中的数据
            Product byId = productMapper.findById(pid);
            cart.setPrice(byId.getPrice());

            cart.setCreatedUser(username);
            cart.setModifiedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedTime(date);

            // 执行插入操作
            Integer rows = cartMapper.insert(cart);
            if (rows != 1) {
                throw new InsertEception("插入数据时产生未知异常");
            }
        } else { // 表示当前的商品在购物车中已经存在，则更新这条数据的num值
            int i = result.getNum() + amount;
            Integer integer = cartMapper.updateNumByCid(result.getCid(), i, username, date);
            if (integer != 1) {
                throw new UpdateException("更新数据时产生未知异常");
            }
        }
    }

    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        return cartMapper.findVOByUid(uid);
    }

    @Override
    public Integer addNum(Integer cid, Integer uid, String username) {
        Cart result = cartMapper.findByCid(cid);
        if (result == null) {
            throw new CartNotFoundException("数据不存在");
        }
        if (!result.getUid().equals(uid)) {
            throw new AccessDeniedException("数据非法访问");
        }
        int num = result.getNum() + 1;
        Integer integer = cartMapper.updateNumByCid(cid, num, username, new Date());
        if (integer != 1) {
            throw new UpdateException("更新数据失败");
        }
        //返回新的购物车数量
        return num;
    }

    @Override
    public List<CartVO> getVOByCid(Integer uid, Integer[] cids) {
        List<CartVO> list = cartMapper.findVOByCids(cids);
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO next = it.next();
            if (!next.getUid().equals(uid)) { // 表示当前的数据不属于当前的用户
                //从集合中移除这个元素
                list.remove(next);
            }
        }
        return list;
    }
}